package com.obelisco.vista.componentes;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import nextapp.echo2.app.Alignment;
import nextapp.echo2.app.Border;
import nextapp.echo2.app.Color;
import nextapp.echo2.app.Column;
import nextapp.echo2.app.Component;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.Insets;
import nextapp.echo2.app.ListBox;
import nextapp.echo2.app.ResourceImageReference;
import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;
import nextapp.echo2.app.event.ListDataListener;
import nextapp.echo2.app.layout.ColumnLayoutData;
import nextapp.echo2.app.list.ListModel;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.MethodUtils;

import com.obelisco.vista.controles.Button;
import com.obelisco.vista.controles.Grid;
import com.obelisco.vista.controles.Label;



import echopointng.ContainerEx;

public class DobleLista2 extends ContainerEx {
	
	private String campoComparar = ""; 
	private String campoMostrar = "";
	
	private String tituloListaIzquierda = "";
	private String tituloListaDerecha = "";
	
	private boolean modoRepetir = false;
	private boolean nombreAtributoIguales = true;
	
	ListBox listBoxIzquierda;
	ListBox listBoxDerecha;
	
	Button btnADerecha;
	Button btnAIzquierda;
	
	List grupoIzquierda = new ArrayList();
	List grupoDerecha = new ArrayList();;
	
	String[] atributos;
	Component container;	

	public DobleLista2() {
		super();
		configurarControles();
	}

	public DobleLista2(String tituloListaIzquierda, String tituloListaDerecha) {
		super();
		this.tituloListaIzquierda = tituloListaIzquierda;
		this.tituloListaDerecha = tituloListaDerecha;
		configurarControles();
	}
	
	public void inicializarDatos(List datosIzquierda, List datosDerecha, String campoComparar, String campoMostrar) {
		this.campoMostrar = campoMostrar;
		//configurarControles();
		inicializar(datosIzquierda, datosDerecha, campoComparar);
	}
	
	private void pasarSeleccion(ListBox listaOrigen, ListBox listaDestino,List listOrigen, List listDestino)
	{				
		if ((listOrigen.size() > 0) && (listaOrigen.getSelectedValue() != null))
		{			
			int[] arregloSeleccionados = listaOrigen.getSelectedIndices();
			Object objetoRemovido = listOrigen.remove(arregloSeleccionados[0]);
			listDestino.add(objetoRemovido);
			//listOrigen.remove(arregloSeleccionados[0]);			
			
			listaOrigen.setModel(new ModeloLista(listOrigen, this.campoMostrar ));
			listaDestino.setModel(new ModeloLista(listDestino, this.campoMostrar ));
		}
	}
		
	private ActionListener acciones = new ActionListener()
	{		
		public void actionPerformed(ActionEvent e) {
			if (e.getActionCommand().equals("aDerecha"))
			{
				pasarSeleccion(listBoxIzquierda, listBoxDerecha, grupoIzquierda, grupoDerecha);
			}
			else
			{
				pasarSeleccion(listBoxDerecha,listBoxIzquierda, grupoDerecha, grupoIzquierda);
			}
		}
		
	};

	private void inicializar(List datosIzquierda, List datosDerecha, String campoComparar) {
		this.campoComparar = campoComparar;
		
		if (datosIzquierda != null)
		{
			this.grupoIzquierda = datosIzquierda;
		} 
		else
		{
			this.grupoIzquierda = new ArrayList();
			datosIzquierda = new ArrayList();
		}
		
		if (datosDerecha != null)
		{
			this.grupoDerecha = datosDerecha;
		}
		else
		{
			this.grupoDerecha = new ArrayList();
			datosDerecha = new ArrayList();
		}
		
		if (modoRepetir == false)
		{
			Object objetoDer = null;
			Object objetoIzq = null;
			char primeraLetra = campoComparar.charAt(0);			
			String primeraLetraMayuscula = new String();
			primeraLetraMayuscula = primeraLetraMayuscula.valueOf(primeraLetra);
			primeraLetraMayuscula = primeraLetraMayuscula.toUpperCase();
			campoComparar = primeraLetraMayuscula + campoComparar.substring(1, campoComparar.length());
			for (int i = 0; i < datosIzquierda.size(); i++)
			{
				try {					
					objetoIzq = MethodUtils.invokeExactMethod(datosIzquierda.get(i), "get" + campoComparar,null);
				} catch (Exception e) {					
					e.printStackTrace();
				} 
				for (int j = 0; j < datosDerecha.size(); j++)					
				{					
					try {
						objetoDer = MethodUtils.invokeExactMethod(datosDerecha.get(j), "get" + campoComparar,null);
					} catch (Exception e) {						
						e.printStackTrace();
					} 
					
					if (objetoIzq.equals(objetoDer))
					{
						datosIzquierda.remove(i);
						i = i - 1;
					}
				}
			}
		}
		iniciarListaDerechaIzquierda();
	}
	
	private void iniciarListaDerechaIzquierda() {		
		listBoxIzquierda.setModel(new ModeloLista(grupoIzquierda, this.campoMostrar));
		listBoxDerecha.setModel(new ModeloLista(grupoDerecha, this.campoMostrar));
	}
		
	private void configurarControles() {
		setWidth(new Extent(100, Extent.PERCENT));
		setHeight(new Extent(100, Extent.PERCENT));
		Column fila = new Column();
		Grid grid = new Grid();
		grid.setSize(3);
		if (!this.tituloListaIzquierda.equals("") ||!this.tituloListaDerecha.equals("")){
			grid.add(new Label(this.tituloListaIzquierda));
			grid.add(new Label(""));
			grid.add(new Label(this.tituloListaDerecha));
		}	
		listBoxIzquierda = new ListBox();
		listBoxIzquierda.setWidth(new Extent(200,Extent.PX));
		listBoxIzquierda.setHeight(new Extent(150,Extent.PX));
		listBoxIzquierda.setBorder(new Border(new Extent(2, Extent.PX), Color.BLACK,Border.STYLE_SOLID));
		grid.add(listBoxIzquierda);
		Column columnaBtns = new Column();
		grid.add(columnaBtns);
		ResourceImageReference imageReference1 = new ResourceImageReference("/com/obelisco/vista/ui/imagenes/botones/sumar.png");
		btnADerecha = new Button(imageReference1);		
		btnADerecha.setInsets(new Insets(new Extent(0, Extent.PX)));		
		ColumnLayoutData btnLayoutData_1 = new ColumnLayoutData();
		btnLayoutData_1.setInsets(new Insets(new Extent(10, Extent.PX)));
		btnADerecha.setLayoutData(btnLayoutData_1);
		columnaBtns.add(btnADerecha);
		ResourceImageReference imageReference2 = new ResourceImageReference("/com/obelisco/vista/ui/imagenes/botones/quitar.png");
		btnAIzquierda = new Button(imageReference2);		
		btnAIzquierda.setIcon(imageReference2);
		
		btnADerecha.addActionListener(acciones);
		btnADerecha.setActionCommand("aDerecha");
		
		btnAIzquierda.addActionListener(acciones);
		btnAIzquierda.setActionCommand("aIzquierda");
		
		
		ColumnLayoutData btnLayoutData_2 = new ColumnLayoutData();
		btnLayoutData_2.setInsets(new Insets(new Extent(10, Extent.PX)));
		btnAIzquierda.setLayoutData(btnLayoutData_2);
		columnaBtns.add(btnAIzquierda);
		listBoxDerecha = new ListBox();
		listBoxDerecha.setWidth(new Extent(200,Extent.PX));
		listBoxDerecha.setHeight(new Extent(150,Extent.PX));
		listBoxDerecha.setBorder(new Border(new Extent(2, Extent.PX), Color.BLACK,Border.STYLE_SOLID));
		grid.add(listBoxDerecha);
		ColumnLayoutData columnLayoutData = new ColumnLayoutData();
		columnLayoutData.setAlignment(new Alignment(Alignment.CENTER,Alignment.CENTER));
		columnLayoutData.setInsets(new Insets(new Extent(0, Extent.PX),new Extent(4, Extent.PERCENT), new Extent(0, Extent.PX),new Extent(0, Extent.PX)));
		grid.setLayoutData(columnLayoutData);
		fila.add(grid);
		add(fila);
	}

	public List getGrupoDerecha() {
		return grupoDerecha;
	}

	public void setGrupoDerecha(List grupoDerecha) {
		this.grupoDerecha = grupoDerecha;
	}

	public List getGrupoIzquierda() {
		return grupoIzquierda;
	}

	public void setGrupoIzquierda(List grupoIzquierda) {
		this.grupoIzquierda = grupoIzquierda;
	}

	public boolean isModoRepetir() {
		return modoRepetir;
	}

	public void setModoRepetir(boolean modoRepetir) {
		this.modoRepetir = modoRepetir;
	}

	public boolean isNombreAtributoIguales() {
		return nombreAtributoIguales;
	}

	public void setNombreAtributoIguales(boolean nombreAtributoIguales) {
		this.nombreAtributoIguales = nombreAtributoIguales;
	}

	public String getTituloListaDerecha() {
		return tituloListaDerecha;
	}

	public void setTituloListaDerecha(String tituloListaDerecha) {
		this.tituloListaDerecha = tituloListaDerecha;
	}

	public String getTituloListaIzquierda() {
		return tituloListaIzquierda;
	}

	public void setTituloListaIzquierda(String tituloListaIzquierda) {
		this.tituloListaIzquierda = tituloListaIzquierda;
	}
}

class ModeloLista implements ListModel{
	
	private List listaDatos;
	private String atributo;
	
	public ModeloLista(List listaDatos, String atributo) {
		this.listaDatos = listaDatos;
		this.atributo = atributo;		
	}

	public void addListDataListener(ListDataListener arg0) {
		// TODO Auto-generated method stub		
	}

	public Object get(int fila) {
		Object valor = null;
		try {
			valor = BeanUtils.getProperty(listaDatos.get(fila), atributo);
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return valor;
	}

	public void removeListDataListener(ListDataListener arg0) {
		// TODO Auto-generated method stub		
	}

	public int size() {
		return listaDatos.size();
	}
}